home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / comms / other / micq-0.4.0 / msg_queue.c < prev    next >
C/C++ Source or Header  |  1999-05-14  |  3KB  |  157 lines

  1. /************************************************************
  2. Author Lawrence Gold
  3. Handles resending missed packets.
  4. *************************************************************/
  5. #include "msg_queue.h"
  6. #include "micq.h"
  7. #include <stdlib.h>
  8. #include <assert.h>
  9. #include <limits.h>
  10. #include "mreadline.h"
  11.  
  12. static struct msg_queue *queue= NULL;
  13.  
  14.  
  15. void msg_queue_init( void )
  16. {
  17.     queue = malloc( sizeof( *queue ) );
  18.     queue->entries = 0;
  19.     queue->head = queue->tail = NULL;
  20. }
  21.  
  22.  
  23. struct msg *msg_queue_peek( void )
  24. {
  25.     if ( NULL != queue->head )
  26.     {
  27.         return queue->head->msg;
  28.     }
  29.     else
  30.     {
  31.         return NULL;
  32.     }
  33. }
  34.  
  35.  
  36. struct msg *msg_queue_pop( void )
  37. {
  38.     struct msg *popped_msg;
  39.     struct msg_queue_entry *temp;
  40.  
  41.     if ( ( NULL != queue->head ) && ( queue->entries > 0 ) )
  42.     {
  43.         popped_msg = queue->head->msg;    
  44.         temp = queue->head->next;
  45.         free(queue->head);
  46.         queue->head = temp;
  47.         queue->entries--;
  48.         if ( NULL == queue->head )
  49.         {
  50.             queue->tail = NULL;
  51.         }
  52.        /* if ( 0x1000 < Chars_2_Word( &popped_msg->body[6] ) ) {
  53.        M_print( "\n\n******************************************\a\a\a\n"
  54.                 "Error!!!!!!!!!!!!!!!!!!!!!\n" );
  55.     }*/
  56.         return popped_msg;
  57.     }
  58.     else
  59.     {
  60.         return NULL;
  61.     }
  62. }
  63.  
  64.  
  65. void msg_queue_push( struct msg *new_msg)
  66. {
  67.     struct msg_queue_entry *new_entry;
  68.  
  69.     assert( NULL != new_msg );
  70.     
  71.     if ( NULL == queue ) return;
  72.  
  73.     new_entry = malloc(sizeof(struct msg_queue_entry));
  74.     if ( new_entry == NULL ) {
  75.        M_print( "Memory exhausted!!\a\n" );
  76.        exit( -1 );
  77.     }
  78.     new_entry->next = NULL;
  79.     new_entry->msg = new_msg;
  80.  
  81.     if (queue->tail)
  82.     {
  83.         queue->tail->next = new_entry;
  84.         queue->tail = new_entry;
  85.     }
  86.     else
  87.     {
  88.         queue->head = queue->tail = new_entry; 
  89.     }
  90.  
  91.     queue->entries++;
  92. }
  93.  
  94. void Dump_Queue( void )
  95. {
  96.    int i;
  97.    struct msg *queued_msg;
  98.     
  99.    assert( queue != NULL );
  100.    assert( 0 <= queue->entries );
  101.    
  102.    M_print( "\nTotal entries %d\n", queue->entries );
  103.    for (i = 0; i < queue->entries; i++)
  104.    {
  105.        queued_msg = msg_queue_pop();
  106.        M_print( "SEQ = %04x\tCMD = %04x\tattempts = %d\tlen = %d\n",
  107.           (queued_msg->seq>>16), Chars_2_Word( &queued_msg->body[CMD_OFFSET] ),
  108.       queued_msg->attempts, queued_msg->len );
  109.        if ( Verbose ) {
  110.           Hex_Dump( queued_msg->body, queued_msg->len );
  111.        }
  112.        msg_queue_push( queued_msg );
  113.    }
  114. }
  115.  
  116. void Check_Queue( DWORD seq )
  117. {
  118.    int i;
  119.    struct msg *queued_msg;
  120.     
  121.    assert( 0 <= queue->entries );
  122.    
  123.    for (i = 0; i < queue->entries; i++)
  124.    {
  125.        queued_msg = msg_queue_pop();
  126.        if (queued_msg->seq != seq)
  127.        {
  128.            msg_queue_push( queued_msg );
  129.        }
  130.        else
  131.        {
  132.            if ( Verbose )
  133.            {
  134.            R_undraw ();
  135.                M_print( "\nRemoved message with SEQ %04X CMD ", queued_msg->seq>>16);
  136.            Print_CMD( Chars_2_Word( &queued_msg->body[CMD_OFFSET] ) );
  137.            M_print( " from resend queue because of ack.\n" );
  138.                
  139.            R_redraw ();
  140.            }
  141.  
  142.            free(queued_msg->body);
  143.            free(queued_msg);
  144.  
  145.            if ((queued_msg = msg_queue_peek()) != NULL)
  146.            {
  147.                next_resend = queued_msg->exp_time;
  148.            }
  149.            else
  150.            {
  151.                next_resend = INT_MAX;
  152.            }
  153.            break;
  154.        }
  155.    }
  156. }
  157.